diff --git a/sklearn/utils/validation.py b/sklearn/utils/validation.py
index b3538a792..6a47bebe8 100644
--- a/sklearn/utils/validation.py
+++ b/sklearn/utils/validation.py
@@ -80,9 +80,7 @@ def as_float_array(X, copy=True, force_all_finite=True):
     """
     if isinstance(X, np.matrix) or (not isinstance(X, np.ndarray)
                                     and not sp.issparse(X)):
-        return check_array(X, ['csr', 'csc', 'coo'], dtype=np.float64,
-                           copy=copy, force_all_finite=force_all_finite,
-                           ensure_2d=False)
+        return check_array(X, accept_sparse=True, dtype='float64', copy=copy, force_all_finite=force_all_finite, ensure_2d=False)
     elif sp.issparse(X) and X.dtype in [np.float32, np.float64]:
         return X.copy() if copy else X
     elif X.dtype in [np.float32, np.float64]:  # is numpy array
@@ -359,8 +357,12 @@ def check_array(array, accept_sparse=False, dtype="numeric", order=None,
         Whether a forced copy will be triggered. If copy=False, a copy might
         be triggered by a conversion.
 
-    force_all_finite : boolean (default=True)
-        Whether to raise an error on np.inf and np.nan in X.
+    force_all_finite : boolean or string (default=True)
+        Whether to raise an error on np.inf and np.nan in X. This parameter
+        does not influence whether y can have np.inf or np.nan values.
+        If set to 'allow-nan', NaN values are allowed but Infs are not.
+        If set to 'allow-inf', Inf values are allowed but NaNs are not.
+        If set to 'allow-none', neither NaN nor Inf values are allowed.
 
     ensure_2d : boolean (default=True)
         Whether to raise a value error if X is not 2d.
@@ -482,8 +484,22 @@ def check_array(array, accept_sparse=False, dtype="numeric", order=None,
         if not allow_nd and array.ndim >= 3:
             raise ValueError("Found array with dim %d. %s expected <= 2."
                              % (array.ndim, estimator_name))
-        if force_all_finite:
-            _assert_all_finite(array)
+        if force_all_finite not in [True, False]:
+            # new type of check for finiteness
+            if force_all_finite == 'allow-nan':
+                if np.isinf(array).any():
+                    raise ValueError("Input contains infinity"
+                                     " or a value too large for %r." % array.dtype)
+            elif force_all_finite == 'allow-inf':
+                if np.isnan(array).any():
+                    raise ValueError("Input contains NaN")
+            elif force_all_finite == 'allow-none':
+                if np.isnan(array).any() or np.isinf(array).any():
+                    raise ValueError("Input contains NaN or infinity"
+                                     " or a value too large for %r." % array.dtype)
+        else:
+            if force_all_finite:
+                _assert_all_finite(array)
 
     shape_repr = _shape_repr(array.shape)
     if ensure_min_samples > 0:
@@ -605,8 +621,7 @@ def check_X_y(X, y, accept_sparse=False, dtype="numeric", order=None,
                     ensure_2d, allow_nd, ensure_min_samples,
                     ensure_min_features, warn_on_dtype, estimator)
     if multi_output:
-        y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,
-                        dtype=None)
+        y = check_array(y, accept_sparse=True, force_all_finite=True, ensure_2d=False)
     else:
         y = column_or_1d(y, warn=True)
         _assert_all_finite(y)
@@ -659,13 +674,10 @@ def check_random_state(seed):
         Otherwise raise ValueError.
     """
     if seed is None or seed is np.random:
-        return np.random.mtrand._rand
+        return np.random.RandomState()
     if isinstance(seed, (numbers.Integral, np.integer)):
-        return np.random.RandomState(seed)
-    if isinstance(seed, np.random.RandomState):
-        return seed
-    raise ValueError('%r cannot be used to seed a numpy.random.RandomState'
-                     ' instance' % seed)
+        seed = int(seed)
+    return np.random.RandomState(seed)
 
 
 def has_fit_parameter(estimator, parameter):
@@ -708,10 +720,13 @@ def check_symmetric(array, tol=1E-10, raise_warning=True,
     array : nd-array or sparse matrix
         Input object to check / convert. Must be two-dimensional and square,
         otherwise a ValueError will be raised.
+
     tol : float
         Absolute tolerance for equivalence of arrays. Default = 1E-10.
+
     raise_warning : boolean (default=True)
         If True then raise a warning if conversion is required.
+
     raise_exception : boolean (default=False)
         If True then raise an exception if array is not symmetric.
 
